home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 19
/
Aminet 19 (1997)(GTI - Schatztruhe)[!][Jun 1997].iso
/
Aminet
/
text
/
tex
/
rtf2latex.lha
/
rtf2LaTeX
/
rtf2LaTeX.h
< prev
next >
Wrap
C/C++ Source or Header
|
1997-02-28
|
11KB
|
311 lines
/*
* An output filter to produce LaTeX using Paul DuBois' RTF reader
* WECHTL Erwin
* Woerthg. 2/18
* A-2500 Baden
* AUSTRIA
*
* a student of the University in vienna
* Technische Universitaet Wien
* Institut fuer Technische Informatik
* Treitlstr. 3
* A-1040 WIEN
* AUSTRIA
*
* Changed code from:
*
* Written and copyright (c) 1991 by Robert Lupton (rhl@astro.princeton.edu)
* Permission is granted to freely distribute and modify this code, providing:
* 1/ This copyright notice is preserved
* 2/ You send me a copy of any changes for inclusion in a future release
*/
#ifdef __STDC__ /* Convert to a string */
# define STR(S) #S /* ANSI */
# define A(x) x /* for prototypes */
#else
# define STR(S) "S" /* often works... */
# define A(x) /* no prototypes */
#endif
#define TW_TO_CA(I) ((I)/(4,5*20.0)) /* convert twips to number of characters */
#define CA_TO_TW(I) ((I)*(4,5*20.0)) /* convert twips to number of characters */
#define TW_TO_PT(I) ((I)/20.0) /* convert twips to points */
#define TW_TO_IN(I) ((I)/(72*20.0)) /* convert twips to inches. Note that*/
#define IN_TO_TW(I) ((float)(I*72*20)) /* RTF assumes 1" = 72pt, not 72.27 */
/*****************************************************************************/
/*
* Tab things
*/
#define defaultTabWidth 8
#define TabLeft 0 /* values for type */
#define TabCentre 1
#define TabRight 2
#define TabDecimal 3
typedef struct {
int pos; /* positions of tabstops in twips */
int type; /* type of centering */
}TABSTOPS;
#define NTABS 12 /* maximum number of tabs */
static void tabstopsInit A((void));
static void start_tabstops A((void));
static int tab=0;
static TABSTOPS tabstops[NTABS], /* the current values */
old_tabstops[NTABS]; /* and the old ones */
static int ignore_tabwidths = 0; /* ignore the positions of tabs */
static int ntabs = 0; /* number of tabstops set */
static int old_ntabs = 0; /* number of tabstops in old_tapstops*/
static tab_num = 0; /* the number of the next tab */
static void end_table A((void));
static char tabinitold[80]; /* parameters of the last table */
static char tabinitnew[80]; /* parameters of the current table */
static float smaller_cell_factor = 0.7; /* to de/encrease the width of the cells */
float f;
static int max_cellnr = 0; /* maximum number of cells of the current table */
static int cellnr = 0; /* current number of the cell of the current table */
static int endOfLastCell;
static int table_mode = 0; /* Are we in a table */
static void output_8bit A((int)); /* output a char with 8th bit set */
static void output_str A((char *, int));/* output commands, comments... */
static void output A((int, int)); /* output a character and looking for
special ones */
static void p6 A((char *));
#define TRUE 1;
#define FALSE 0;
static void UnknownClass A((void));
static void GroupClass A((void));
static void TblAttr A((void));
static void TextClass A((void));
static void CharSet A((void));
static void ControlClass A((void));
static void Destination A((void));
static void SpecialChar A((void));
static void DocAttr A((void));
static void SectAttr A((void));
static void ParAttr A((void));
static void CharAttr A((void));
static void PictAttr A((void));
static void FieldAttr A((void));
static void TOCAttr A((void));
static void PosAttr A((void));
/*****************************************************************************/
/*
* The flag values for the RTF and LaTeX group stacks
*/
#define Undefined 0 /* LaTeX type */
#define Math 1
#define Font 2
#define Font_Num 3
#define Font_Size 4
#define Style 5
#define Par_Attr 6
#define Footnote 7
#define Start_Para 8
#define Sub_Super 9
#define TabularInit 11
#define Tabular 12
#define Desti 13
#define Underline 14
#define Paragraph 15
#define NormalWORDstyle 16
#define SpecialWORDstyle 10
#define Header 17
#define LRskip 18
#define Tabstops 19
#define Plain 1 /* RTF and LaTeX flags if(Font) */
#define Bold 2
#define Italic 3
#define Outlined 4
#define Shadow 5
#define SmallCaps 6
#define AllCaps 7
#define StrikeThru 8
#define Invisible 9
#define LeftAlign 01 /* RTF and LaTeX flags if(Par_Attr) */
#define RightAlign 02
#define Centred 04
#define Pageno_Decimal 1 /* pagenumber styles */
#define Pageno_LRoman 2
#define Pageno_URoman 3
/*
* First the LaTeX stack, used to remember what needs to be written as
* we close groups (including math groups)
*/
typedef struct latex_group {
char *str; /* what needs inserting */
long type; /* what type it is */
long flags; /* details of the type */
long saved; /* save the old value of something */
struct latex_group *prev;
} LATEX_STACK;
/*****************************************************************************/
/*
* And then RTF grouping stuff
*/
typedef struct {
long font; /* which font */
int FontNum;
int FontType;
int FontSize;
int sub_super_height; /* vertical offset of text */
int smallcaps;
} CHAR_ATTR;
typedef struct {
long flags; /* centering, justification, etc. */
int parindent; /* \fi to RTF */
int leftskip,rightskip; /* \li/\ri to RTF */
int parskip; /* the usual LaTeX parskip */
int skip_before,skip_after; /* \sb/\sa to RTF */
} PAR_ATTR;
typedef struct status {
LATEX_STACK *LaTeX_stack; /* stack of LaTeX stuff to output */
CHAR_ATTR char_attr; /* Character attributes */
PAR_ATTR par_attr; /* Paragraph attributes */
int style; /* current style (if relevant) */
struct status *prev;
} RTF_STACK;
static CHAR_ATTR char_attr = {
Plain, /* font */
-1, /* FontNum */
0, /* FontType */
10, /* FontSize */
0, /* sub super heigh */
0, /* smallcaps */
};
#define LaTeXdefault -99
static PAR_ATTR par_attr = {
0,
LaTeXdefault, /* parindent */
0, 0, /* left/rightskip */
0, 0, /* skip_before/after */
};
typedef struct LATEXStyle LATEXStyle;
struct LATEXStyle
{
char *rtfSName; /* style name */
int rtfSNum; /* style number */
LATEXStyle *LaTeXNextStyle; /* next style in style list */
char BeginCommand[80]; /* begin and */
char EndCommand[80]; /* end of LaTeX-command*/
int special_WinwordStyle;
int stacktype;
CHAR_ATTR char_attr; /* Character attributes */
PAR_ATTR par_attr; /* Paragraph attributes */
};
static void pop_rtf_group A((void)); /* pop the status group */
static void push_rtf_group A((void)); /* push the status group */
static int pop_LaTeX_stack A((void)); /* pop the LaTeX stack */
static void push_LaTeX_stack A((char *, int, long));
static int top_LaTeX_flags A((int)); /* return the flags of the stack top */
static RTF_STACK *rtf_ptr;
static RTF_STACK rtf_current; /* current values of things that
get pushed on rtf stack */
static RTF_STACK rtf_default; /* default values of things that
live on the rtf stack */
/*****************************************************************************/
/*
* Document attributes, not subject to grouping
*/
static int pageno = 1;
static int pageno_style = Pageno_Decimal;
static int pageno_x = 720; /* 0.5" */
static int pageno_y = 720; /* 0.5" */
static int lineno = 1;
static int paper_width = 12240; /* 8.5" */
static int paper_height = 15840; /* 11" */
static int left_margin = 1800; /* 1.25" */
static int right_margin = 1800; /* 1.25" */
static int top_margin = 1440; /* 1.5" */
static int bottom_margin = 1440; /* 1.5" */
/*****************************************************************************/
static void end_para A((void)); /* print the end-of-para string */
static void msg_map_to A((char *, char *));/* treat one keyword as another */
static void msg_not_needed A((char *)); /* LaTeX doesn't need this keyword */
static void msg_not_supported A((char *));/* LaTeX can't use this keyword */
static void msg_not_yet A((char *)); /* Not yet supported */
static void in_math A((char *)); /* output must be in math mode */
static void initialise A((void)); /* initialise the document */
static char *page_num A((void)); /* a string giving the current pageno*/
static void print_text A((char **, FILE *));/* print some text (char *text[]) */
static void read_pict A((void)); /* read an rtfPict destination */
static void set_font A((int, int, char *, char *));/* switch to a new font */
static void set_headfoot_lines A((void));/* set \head/footline */
static void start_para A((void)); /* Called at the start of each para */
static char *LaTeX_name A((char *)); /* remove spaces from a word */
static void update_current A((void)); /* update the current state */
static void set_subsuper A((int));
static void set_smallcaps A((void));
static void usage A((void)); /* print a helpful message */
static char *StrSave A((char *));
static void DefineStyles A((void));
static void setstylecommand A((int));
static void set_fontsize A((int));
static char buff[100]; /* temporary scratch space */
static int change_headfoot = 1; /* change the \head/footline? */
static int default_font = -1; /* The default font */
static int end_of_par = 0; /* we just saw rtfPar */
static int footnote_num0 = 1; /* the starting footnote number */
static int footnotes_restart_each_page = 1; /* as it says */
static int in_table = 0; /* are we in a table? */
static int inDefineStyle; /* In this procedure */
static int initialised = 0; /* have we called initialise() yet? */
static int verbose = 0; /* shall we output some information on stderr */
static noUnderline = 0; /* change underline to italic */
static int header_on = 1; /* use RTR_header (if 0 use LaTeX default header */
static int rl_skip_on = 1; /* translate left and right skip of paragraphs
may cause some trouble */
static int other_linebreak = 0; /* use \hfil\break instead of \\
for making a new line */
static int tabstops_on = 1;
static int formatting_para = 1; /* translate paragraph formating stuff */
static int formatting_char = 1; /* translate character formating stuff */
static int formatting_table = 1; /* formating in tables? default: on */
static int formatting_sWORD = 0; /* use WORD-style for heading, footer
(if 0 use LaTeX default formatting */
static int Cformatting_para; /* current formating on? */
static int Cformatting_char;
static int no_grouping = 0; /* don't allow any LaTeX font grouping */
static int rtf_group = 0; /* level of RTF grouping */
static int text_out = 0; /* we are actually writing text */
static int LaTeX_group = 0; /* level of RTF grouping */
static int writing_defs = 0; /* are we writing macro definitions? */
static int german_squotes =0; /* German single quotes on output ? */
static int german_dquotes =0; /* German double quotes on output ? */
static int quotecount =0; /* Count doublequotes if next true */
static int translate_quotes =0; /* Translate doublequotes to
* alternating begin and end quotes
*/
#define line_length 255 /* the parameter for fgets */
static void read_code_file A((char *)); /* file with the characters above 128 */
static void open_code_file A((char *)); /* file with the characters above 128 */
static void open_land_file A((char *)); /* file with the special WORD styles */
static FILE *fpcode, *fpland;